package logica_de_presentacion;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
import java.util.Calendar;

import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerDateModel;
import javax.swing.SpinnerNumberModel;

import comun.Serie;
import logica_de_negocio.ExcepDatosNoAdmitidos;
import logica_de_negocio.FaltanDatosEnLaBaseDeDatos;
import logica_de_negocio.excepAnadirDupli;
import logica_de_negocio.gestorSerie;

public class FormularioAnadirModificarSerie extends JInternalFrame implements
		ActionListener {

	private static final long serialVersionUID = 1L;
	protected JButton salir, anadir;
	protected JTextField titu, director, pais;
	protected JSpinner.DateEditor spiFecha_ini, spiFecha_fin;
	protected JSpinner spiEmmy;
	protected boolean estadoModi;

	private int idSerieOri;

	/**
	 * Ventana para anadir/modificar capitulos
	 */

	public FormularioAnadirModificarSerie(boolean estadoModi, int actEmmy,
			java.util.Date fechaIni, java.util.Date fechaFin) {

		super("Anadir/Modificar serie", true, true, true, true);

		this.estadoModi = estadoModi;
		this.setVisible(true);
		this.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
		JPanel textos = new JPanel(new GridLayout(10, 2));// FILAS,Columnas
		JPanel Botones = new JPanel();
		this.getContentPane().setLayout(new FlowLayout());// TIPO DE ORDENACION

		// TEXTO
		// TITULO
		JPanel jpTitu=new JPanel();
		JLabel jltitu=new JLabel("Titulo de la Serie: ");
		titu = new JTextField(20);
		jpTitu.add(jltitu);
		jpTitu.add(titu);
		textos.add(jpTitu);
		//DIRECTOR
		JPanel jpDire=new JPanel();
		JLabel jlDire=new JLabel("Director de la Serie: ");
		jpDire.add(jlDire);
		director=new JTextField(20);
		jpDire.add(director);
		textos.add(jpDire);
		//PAIS
		JPanel jpPais=new JPanel();
		JLabel jlPais=new JLabel("Origen de la Serie(Pais): ");
		jpPais.add(jlPais);
		pais=new JTextField(20);
		jpPais.add(pais);
		textos.add(jpPais);
		// EMMY
		spiEmmy = new JSpinner();// ACTUAL , MIN, MAX, SALTO
		spiEmmy.setModel(new SpinnerNumberModel(actEmmy, 0, 99, 1));
		spiEmmy.setEditor(new JSpinner.NumberEditor(spiEmmy, "0"));
		JLabel jlEMMY = new JLabel("Numeros EMMY");
		JPanel jpEMMY = new JPanel();
		jpEMMY.add(jlEMMY);
		jpEMMY.add(spiEmmy);
		textos.add(jpEMMY);
		// FECHA DE INI
		JSpinner se = new JSpinner(new SpinnerDateModel(fechaIni, null, null,
				Calendar.DAY_OF_WEEK_IN_MONTH));
		spiFecha_ini = new JSpinner.DateEditor(se, "MM/d/yyyy");
		se.setEditor(spiFecha_ini);
		JLabel jlfecha_ini = new JLabel(
				"Fecha de inicio de emision de la serie:");
		JPanel jpfecha_ini = new JPanel();
		jpfecha_ini.add(jlfecha_ini);
		jpfecha_ini.add(se);
		textos.add(jpfecha_ini);
		// FECHA DE FIN
		JSpinner ses = new JSpinner(new SpinnerDateModel(fechaFin, null, null,
				Calendar.DAY_OF_WEEK_IN_MONTH));
		spiFecha_fin = new JSpinner.DateEditor(ses,"MM/d/yyyy");
		ses.setEditor(spiFecha_fin);
		JLabel jlfecha_fin = new JLabel("Fecha de fin de emision de la serie:");
		JPanel jpfecha_fin = new JPanel();
		jpfecha_fin.add(jlfecha_fin);
		jpfecha_fin.add(ses);
		textos.add(jpfecha_fin);

		this.getContentPane().add(textos, "North");

		// BOTONES
		ImageIcon tick = createImageIcon("/logica_de_presentacion/imagenes/TICK.gif");
		if (estadoModi == false) {
			anadir = new JButton("Anadir", tick);
		} else {
			anadir = new JButton("Modificar", tick);
		}
		anadir.setVerticalTextPosition(AbstractButton.CENTER);
		anadir.setHorizontalTextPosition(AbstractButton.LEADING); // aka LEFT,
																	// for
																	// left-to-right
																	// locales
		if (estadoModi == false) {
			anadir.setToolTipText("Anadir la serie en la base de datos");
		} else {
			anadir.setToolTipText("Modificar la serie en la base de datos");
		}
		Botones.add(anadir);
		anadir.addActionListener(this);

		ImageIcon cancelar = createImageIcon("/logica_de_presentacion/imagenes/CANCELAR.gif");
		salir = new JButton("Cancelar", cancelar);
		salir.setVerticalTextPosition(AbstractButton.CENTER);
		salir.setHorizontalTextPosition(AbstractButton.LEADING); // aka LEFT,
																	// for
																	// left-to-right
																	// locales

		Botones.add(salir);
		salir.addActionListener(this);
		// ANADIMOS AL PANEL PRINCIPAL
		this.getContentPane().add(Botones, "South");
		// TAMANO JUSTO
		this.pack();
	}
	@Override
	public void actionPerformed(ActionEvent e) {

		JButton botonPulsa = (JButton) e.getSource();

		if (botonPulsa == salir) {

			int valor = JOptionPane.showConfirmDialog(this, "ESTA SEGURO ?");
			// YES=0, NO=1,Cancel =2
			if (valor == 0) {
				this.dispose();
			}
		} else {// MODIFICAR; o ANADIR

			if (botonPulsa == anadir) {
				gestorSerie gs=new gestorSerie();
				if (estadoModi == false) {
					// ANADIR
					
					try {
						gs.cargarDatos();
						Serie ser = serDese();
						gs.anadirS(ser);;
						// MIRAMOS QUE ESTA
						if (gs.anadido(ser)) {
							JOptionPane.showMessageDialog(new Frame(),
									"Serie anadida");
						}else{
							JOptionPane.showMessageDialog(new Frame(),
									"Serie _NO_ anadida");
						}
						this.dispose();
					} catch (excepAnadirDupli e1) {
						JOptionPane.showMessageDialog(new Frame(), e1.getDes());
					} catch (ExcepDatosNoAdmitidos e1) {
						JOptionPane.showMessageDialog(new Frame(),
								e1.getCausa());
					}catch (ClassNotFoundException e1) {
						JOptionPane.showMessageDialog(new Frame(),
								"No hay informacion en la base de datos");
						this.dispose();
					}
				} else {
					try {
						Serie ser = serDese();
						ser.setId_s(idSerieOri);
						boolean mo = gs.modifySerie(ser);
						// MIRAMOS QUE ESTA
						if (mo) {
							JOptionPane.showMessageDialog(new Frame(),
									"Serie modificado");
						}
						this.dispose();
					} catch (FaltanDatosEnLaBaseDeDatos e1) {
						JOptionPane.showMessageDialog(new Frame(),
								e1.getFalta());
					} catch (ExcepDatosNoAdmitidos e1) {
						JOptionPane.showMessageDialog(new Frame(),
								e1.getCausa());
					} catch (ClassNotFoundException e1) {
						JOptionPane.showMessageDialog(new Frame(),
								"No hay informacion en la base de datos");
						this.dispose();
					}
				}

			}
		}
	}

	private Serie serDese() throws ExcepDatosNoAdmitidos {
		Serie serDese = new Serie();

		serDese.setDirector(director.getText());
		serDese.setEMMY(putEMMY());
		serDese.setFecha_fin(putFecha_fin());
		serDese.setFecha_ini(putFecha_ini());
		fechasCorrectas(serDese.getFecha_ini(),serDese.getFecha_fin());
		serDese.setPais(pais.getText());
		serDese.setTitulo(titu.getText());

		return serDese;
	}

	private void fechasCorrectas(Date fecha_ini, Date fecha_fin) throws ExcepDatosNoAdmitidos {
		
		if(fecha_ini.after(fecha_fin)){
			ExcepDatosNoAdmitidos e=new ExcepDatosNoAdmitidos();
			e.setCausa("La fecha de fin de la serie es menor a la fecha de inicio");
			throw e;
		}
		
	}
	@SuppressWarnings("deprecation")
	private Date putFecha_ini() {

		JFormattedTextField dfecha_ini = spiFecha_ini.getTextField();
		String afecha_ini = dfecha_ini.getText();
		
		java.util.Date newfecha_ini = new java.util.Date(afecha_ini);
		return new Date(newfecha_ini.getYear(), newfecha_ini.getMonth(),
				newfecha_ini.getDay());
	}
	@SuppressWarnings("deprecation")
	private Date putFecha_fin() {

		JFormattedTextField dfecha_fin = spiFecha_fin.getTextField();
		String afecha_fin = dfecha_fin.getText();
		java.util.Date newfecha_fin = new java.util.Date(afecha_fin);
		return new Date(newfecha_fin.getYear(), newfecha_fin.getMonth(),
				newfecha_fin.getDay());
	}

	private Integer putEMMY() throws ExcepDatosNoAdmitidos {

		Integer dev = -1;
		Object a = spiEmmy.getValue();
		dev = (Integer) a;
		if (dev <= -1) {
			ExcepDatosNoAdmitidos e = new ExcepDatosNoAdmitidos();
			e.setCausa("Revise el numero de EMMY selecionado");
			throw e;
		}
		return dev;
	}

	/**
	 * Returns an ImageIcon, or null if the path was invalid.
	 * 
	 * @param path
	 * @return Devuelve la imagen en formato ImageIcon
	 */
	protected static ImageIcon createImageIcon(String path) {
		java.net.URL imgURL = Button.class.getResource(path);
		if (imgURL != null) {
			return new ImageIcon(imgURL);
		} else {
			System.err.println("Couldn't find file: " + path);
			return null;
		}
	}

	public void cargarMO(Serie ser) {

		idSerieOri = ser.getId_s();
		titu.setText(ser.getTitulo());
		director.setText(ser.getDirector());
		pais.setText(ser.getPais());
	}
}